 //两个 非空 的链表，表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的，
 //并且每个节点只能存储 一位 数字。将两个数相加，并以相同形式返回一个表示和的链表。

 //Definition for singly-linked list.
 /**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */

struct ListNode {
     int val;
    ListNode *next;
     ListNode() : val(0), next(nullptr) {}
     ListNode(int x) : val(x), next(nullptr) {}
    ListNode(int x, ListNode *next) : val(x), next(next) {}
 };

class leetCodeSolution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        auto p1 = l1, p2 = l2;
        while ((p1!=nullptr)&&(p2!=nullptr)) {
            p1->val += p2->val;
            p1 = p1->next;
            p2 = p2->next;
        }
        if (p1==nullptr) {
            p1 = l1;
            while (p1->next) p1=p1->next;
            p1->next = p2;
        }
        p1 = l1;
        while (p1) {
            if (p1->val>9) {
                if (p1->next==nullptr) p1->next = new ListNode(0);
                p1->next->val += p1->val/10;
                p1->val %= 10;
            }
            p1 = p1->next;
        }
        return l1;
    }
};




class SocksSolution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        if(l1==nullptr)
            return l2;
        if(l2==nullptr)
            return l1;
        ListNode* returnPtr=l1;
        bool carry=false;
        while(l1!=nullptr && l2 !=nullptr)
        {
            if(carry==true)
            {
                l1->val=l1->val+l2->val+1;
                carry=false;    
            }
            else
            {
                l1->val=l1->val+l2->val;
            }
            if(l1->val>=10)
            {
                l1->val-=10;
                carry=true;
            }
            l1=l1->next;
            l2=l2->next;
        }
        if(carry==true)
        {
            if(l1==nullptr)
            {
                ListNode * testList=returnPtr;
                while(testList->next!=nullptr)
                {
                    testList=testList->next;
                }
                testList->next=l2;
                l1=l2; 
            }
            while(carry==true && l1!=nullptr)
            {
                l1->val+=1;
                if(l1->val==10)
                    l1->val-=10;
                else 
                    carry=false;
                l1=l1->next;
            }
            if(carry==true)
            {
                ListNode * testList=returnPtr;
                while(testList->next!=nullptr)
                {
                    testList=testList->next;
                }
                ListNode *endNode=new ListNode(1);
                testList->next=endNode;   
            }
        }
        else 
        {
            if(l1==nullptr)
            {
                ListNode * testList=returnPtr;
                while(testList->next!=nullptr)
                {
                    testList=testList->next;
                }
                testList->next=l2;
            }
        }
        return returnPtr;
    }
};
